﻿using System.Collections.Generic;
using Castle.Core.Logging;
using User.EF.Contracts;
using User.Global.Contracts.Message;
using User.Web.Models.Admin.Helper;

namespace User.Web.Contracts.Model.Admin
{
    public interface IMemberRightApiModel
    {
        /// <summary>
        /// Liste mit den erlaubten Benutzerrrechten für den übergebenen User
        /// </summary>
        List<IMemberRight> AllowedRights { get; set; }

        /// <summary>
        /// Liste mit den Nicht zugewiesenen Rechten für den übergebenen User
        /// </summary>
        List<IMemberRight> DeniedRights { get; set; }

        /// <summary>
        /// Die aktuelle UserId für die die Rechte geladen werden.
        /// </summary>
        long UserId { get; set; }

        /// <summary>
        /// Der Aktuell verwendete Logger für die jeweilige Klasse
        /// </summary>
        ILogger Logger { get; set; }

        /// <summary>
        /// Hinzufügen einer Message zur Ausgabe.
        /// </summary>
        IAddMessage AddMessage { get; set; }

        /// <summary>
        /// Laden aller Rechte für die übergebene UserId
        /// </summary>
        /// <param name="webQuery">Die aktuell zur verüfügung stehenden Queries</param>
        /// <param name="userId">Die UserId für die die </param>
        /// <returns></returns>
        void LoadRights(IWebQuerySummary webQuery, long userId);

        /// <summary>
        /// Das übergebene Recht dem User entziehen
        /// </summary>
        /// <param name="webQuery">Die aktuell zur verüfügung stehenden Queries</param>
        /// <param name="userId">Die UserId der das Recht entzogen werden soll</param>
        /// <param name="rightId">die RechteId die entfernt werden soll</param>
        /// <returns>TRUE->Erfolgreich | FALSE->Fehler aufgetreten</returns>
        bool RemoveRight(IWebQuerySummary webQuery, long userId, int rightId);

        /// <summary>
        /// Das übergebene Recht dem User hinzufügen
        /// </summary>
        /// <param name="webQuery">Die aktuell zur verüfügung stehenden Queries</param>
        /// <param name="userId">Die UserId der das Recht hinzugefügt werden soll</param>
        /// <param name="rightId">Die RechteId die dem User hinzugefügt werden soll</param>
        /// <returns>TRUE->Erfolgreich | FALSE->Fehler aufgetreten</returns>
        bool AddRight(IWebQuerySummary webQuery, long userId, int rightId);

        /// <summary>
        /// Setzten der Externen und internen Kommunikationsklasse für die passende Ausgabe.
        /// </summary>
        /// <param name="logger">Der Logger für das Filesystem</param>
        /// <param name="addMessage">die Messageanzeige.</param>
        void SetCommunication(ILogger logger, IAddMessage addMessage);
    }
}